/**
 * @param {character[][]} matrix
 * @return {number}
 */
var maximalRectangle = function (matrix) {
  //矩阵的行数 列数
  let m = matrix.length
  let n = matrix[0].length

  //特殊情况处理
  if (m === 0 || n === 0) return 0

  //全局最大面积 每一层的深度
  let maxArea = 0
  let depth = new Array(n).fill(0)
  //遍历数组matrix
  for (let i = 0; i < m; i++) {
    for (let j = 0; j < n; j++) {
      //更新每一层的深度
      depth[j] = matrix[i][j] === '0' ? 0 : depth[j] + 1
    }
    //更新全局最大面积
    maxArea = Math.max(maxArea, maxRectangle(depth))
  }
  //返回全局最大面积
  return maxArea
};

function maxRectangle(depth) {
  //本行的最大面积
  let maxArea = 0
  //单调栈
  let stack = []
  //给depth首尾加哨兵
  depth = [0, ...depth, 0]
  //单调栈求矩形本行的最大面积
  for (let i = 0; i < depth.length; i++) {
    while (stack.length !== 0 && depth[i] < depth[stack[stack.length - 1]]) {
      let height = depth[stack.pop()]
      let width = i - stack[stack.length - 1] - 1
      maxArea = Math.max(maxArea, height * width)
    }
    stack.push(i)
  }
  //返回本行的最大面积
  return maxArea
}